10  REM  ***********************
15  REM 
20  REM  TEXT FILE EDITOR / VIEWER
25  REM 
30  REM  BY MICHAEL O'MALLEY
35  REM 
40  REM  ***********************
50  REM 
100  D$ =  CHR$ (4) : REM  CTRL-D
105  W = 1000 : REM  1000 LINES !
110  DIM W$(W) : REM  1000 LINES !
115  L = 0 : REM  NUMBER OF LINES LOADED
130  F$ = "" : REM  CURRENT FILE
140  P$ = "N/A" : REM  CURRENT DIRECTORY
150  R$ =  CHR$ (13) : REM  CARRIAGE RETURN
155  EO$ =  CHR$ (26) : REM  END-OF-FILE
160  LS = 23 : REM  LINES ON SCREEN
170  FC = 0 : REM  HAS FILE CHANGED 0=NO,1=YES
175  IL = 0 : REM  CURRENT INSERTION POINT IN ARRAY
180  R = 0 : REM  A COUNTER

200  REM  
201  REM  **********************
202  REM    MAIN MENU        
203  REM  **********************
205  TEXT : HOME 
210  PRINT "---------------------------------------"
215  PRINT "      TEXT FILE EDITOR / VIEWER"
220  PRINT "         BY MICHAEL O'MALLEY"
225  PRINT "---------------------------------------"
230  PRINT " DIR : "P$;
235  PRINT ", FILE : "F$;
237  IF F$ <  > "" AND FC = 0 THEN  PRINT " (NOCHG)"
238  IF F$ <  > "" AND FC = 1 THEN  PRINT " (CHG)"
239  IF F$ = "" THEN  PRINT 
240  PRINT "   "L" LINES LOADED (CAPACITY = "W")"
243  PRINT "---------------------------------------";
245  PRINT : PRINT "  F. CHANGE CURRENT FILE"
250  PRINT : PRINT "  D. DISPLAY FILE TO SCREEN"
255  PRINT : PRINT " DE. DELETE LINE(S)"
260  PRINT : PRINT " IN. INSERT LINE(S)"
265  PRINT : PRINT " CD. CHANGE DIRECTORY (PRO-DOS ONLY)"
270  PRINT : PRINT "  C. CATALOG DISK"
272  PRINT : PRINT "  S. SAVE FILE TO DISK"
275  PRINT : PRINT "  Q. QUIT PROGRAM"
285  PRINT : PRINT " PLEASE ENTER YOUR CHOICE : ";
290  A$ = "" : INPUT A$
295  IF A$ = "F" THEN  GOSUB 500 : REM  CHANGE CURRENT FILE.  GOTO USED INSTEAD OF GOSUB TO AVOID THE PROBLEM WITH ONERR AND EMPTY FILES.
300  IF A$ = "D" THEN  GOSUB 700 : REM  DISPLAY FILE TO SCREEN
305  IF A$ = "DE" THEN  GOSUB 900 : REM  DELETE LINE(S)
310  IF A$ = "IN" THEN  GOSUB 1100 : REM  INSERT LINE(S)
315  IF A$ = "CD" THEN  GOSUB 1400 : REM  CHANGE DIRECTORY (PRO-DOS ONLY)
320  IF A$ = "C" THEN  GOSUB 1500 : REM  CATALOG DISK
322  IF A$ = "S" THEN  GOSUB 9400 : REM  SAVE FILE TO DISK
325  IF A$ = "Q" THEN  GOSUB 9900 : REM  QUIT PROGRAM
330  IF A$ <  > "F" AND A$ <  > "D" AND A$ <  > "DE" AND A$ <  > "IN" AND A$ <  > "CD" AND A$ <  > "C" AND A$ <  > "S" AND A$ <  > "Q" THEN  PRINT : PRINT "*ERROR: INVALID INPUT !!" : GOTO 285 : REM  BACK TRY AGAIN ...
499  GOTO 200 : REM  DISPLAY THE MENU

500  REM  
501  REM  **********************
502  REM  CHANGE CURRENT FILE
503  REM  **********************
505  REM  THIS IS CALLED VIA A GOTO INSTEAD OF A GOSUB TO AVOID THE PROBLEM WITH ONERR AND EMPTY FILES. ONERR GOTO SEEMS TO HAVE PROBLEMS WHEN INSIDE A PIECE OF CODE THAT IS ENTERED VIA A GOSUB.
510  GOSUB 9500 : REM  IF CURRENT FILE HAS BEEN CHANGED THEN PROMPT USER TO SAVE IT BEFORE ALLOWING THEM TO SELECT A NEW FILE.
515  PRINT : PRINT 
520  INPUT "ENTER FILE : "; F$
522  REM  POKE 42769,234 : REM CANCEL ALL DOS ERROR MESSAGES.
525  ONERR  GOTO 580 : REM  ON ANY ERRORS ...
527  L = 0
529  PRINT 
530  PRINT D$; "OPEN "; F$
532  PRINT "OPEN "; F$
535  PRINT D$; "READ "; F$
536  PRINT "READ "; F$
537  PRINT "READING FILE ... "
540  FOR I = 1 TO W
545  INPUT W$(I)
555  L = L + 1 : REM  INCREMENT LINES LOADED
570  NEXT I
580  PRINT 
585  PRINT D$; "CLOSE "; F$
590  PRINT L" LINES LOADED !"
595  GOSUB 9700 : REM  HIT ANY KEY TO CONTINUE
597  FC = 0 : REM  FILE HAS NOT CHANGED !
599  GOTO 200

700  REM  
701  REM  **********************
702  REM  DISPLAY FILE TO SCREEN
703  REM  **********************
710  TEXT : HOME 
715  IF F$ = "" THEN  PRINT : PRINT " << NO FILE HAS BEEN SELECTED >>" : GOTO 790
720  IF L = 0 THEN  PRINT : PRINT " << FILE IS EMPTY >>" : GOTO 790
725  C = 0
730  FOR I = 1 TO L
735  PRINT W$(I)
740  C = C + 1
750  IF C = LS THEN C = 0 : GOSUB 9700 : REM  HIT ANY KEY TO CONTINUE
760  NEXT I
790  GOSUB 9700 : REM  HIT ANY KEY TO CONTINUE
799  RETURN 

900  REM  
901  REM  **********************
902  REM  DELETE LINE(S)
903  REM  **********************
915  PRINT : PRINT 
920  PRINT " DELETE FROM LINE (1-"; L; ", -1=QUIT) : ";
922  INPUT SL
923  IF SL =  - 1 THEN  GOTO 990
925  IF SL < 0 THEN  PRINT : PRINT "*ERROR: CANNOT DELETE PRIOR TO START !" : GOTO 915
930  IF SL > L THEN  PRINT : PRINT "*ERROR: CANNOT DELETE AFTER END !" : GOTO 915
940  PRINT : PRINT " DELETE TO LINE ("; SL; "-"; L; ", -1=QUIT) : ";
942  INPUT EL
943  IF EL =  - 1 THEN  GOTO 990
945  IF EL < SL THEN  PRINT : PRINT "*ERROR: CANNOT DELETE PRIOR TO START LINE !" : GOTO 940
950  IF EL > L THEN  PRINT : PRINT "*ERROR: CANNOT DELETE AFTER END !" : GOTO 940
960  FOR IL = EL TO SL STEP  - 1
970  GOSUB 1000 : REM  SHUFFLE DOWN DATA TO REMOVE THIS LINE
980  NEXT IL
985  FC = 1 : REM  FILE HAS CHANGED !
990  GOSUB 9700 : REM  HIT ANY KEY TO CONTINUE
999  RETURN 

1000  REM 
1001  REM  **********************
1002  REM  SHUFFLE DOWN DATA TO REMOVE THIS LINE.
1005  REM  **********************
1010  ONERR  GOTO 1090 : REM  ON ANY ERRORS ...
1035  IF L = IL THEN  GOTO 1090 : REM  NOTHING TO SHUFFLE DOWN
1040  IF IL > L THEN  GOTO 1099 : REM  WE HAVE A PROBLEM HOUSTON !!
1062  REM  PRINT : PRINT "**DEBUG: L = "; L; ", IL = "; IL
1065  FOR R = IL TO L
1070  W$(R) = W$(R + 1)
1080  NEXT R
1090  L = L - 1 : REM  DECREASE THE NUMBER OF LINES IN THE ARRAY
1095  REM  PRINT "DONE SHFFLING !"
1099  RETURN 

1100  REM  
1101  REM  **********************
1102  REM  INSERT LINE(S)
1103  REM  **********************
1110  TEXT : HOME 
1112  IF F$ = "" THEN  PRINT : PRINT " << NO FILE HAS BEEN SELECTED >>" : GOTO 1290
1114  IF L = 0 THEN  GOTO 1150 : REM  FILE IS EMPTY - JUST INSERT LINES AT START
1116  IF L = W THEN  PRINT : PRINT "*ERROR: ARRAY SIZE ("; W; ") REACHED !" : GOTO 1290
1118  PRINT " INSERT LINES AFTER WHICH LINE (0-"; L; ") ";
1120  INPUT IL
1135  IF IL < 0 THEN  PRINT : PRINT "*ERROR: CANNOT INSERT LINE PRIOR TO START !" : GOTO 1115
1140  IF IL > L THEN IL = L : PRINT " INSERTING LINES AT END-OF-FILE"
1150  PRINT 
1152  PRINT " *** ENTER LINES NOW *** "
1154  PRINT " (DO NOT ENTER ANY COMMAS !)"
1156  PRINT "   (ENTER --Q TO QUIT)"
1160  PRINT : PRINT (IL + 1); ". ";
1165  INPUT NL$
1170  IF NL$ = "--Q" THEN  GOTO 1290 : REM  USER WANTS TO QUIT
1175  REM  GOSUB 715 : REM DISPLAY FILE TO SCREEN
1185  GOSUB 1300 : REM  SHUFFLE UP DATA TO MAKE ROOM FOR NEW LINE
1190  W$(IL) = NL$
1192  REM  GOSUB 715 : REM DISPLAY FILE TO SCREEN
1195  FC = 1 : REM  FILE HAS CHANGED !
1200  GOTO 1160 : REM  ASK FOR ANOTHER LINE OF DATA
1290  GOSUB 9700 : REM  HIT ANY KEY TO CONTINUE
1299  RETURN 

1300  REM 
1301  REM  **********************
1302  REM  SHUFFLE UP DATA IN ARRAY TO MAKE ROOM FOR THE NEW LINE.
1305  REM  **********************
1310  ONERR  GOTO 1390 : REM  ON ANY ERRORS ...
1315  IF L = W THEN  PRINT : PRINT "*ERROR: ARRAY SIZE ("; W; ") EXCEEDED !" : GOTO 1399
1320  L = L + 1 : REM  INCREASE THE NUMBER OF LINES IN THE ARRAY
1325  IL = IL + 1 : REM  MOVE TO THE NEXT FREE LINE
1335  IF L = IL THEN  GOTO 1390 : REM  NOTHING TO SHUFFLE DOWN
1350  SP = IL
1360  IF IL <  = 1 THEN SP = 2
1362  REM  PRINT : PRINT "**DEBUG: L = "; L; ", IL = "; IL
1365  FOR R = L TO SP STEP  - 1
1370  W$(R) = W$(R - 1)
1372  REM  PRINT (R-1); " -> "; R; " "; W$(R-1)
1380  NEXT R
1390  W$(IL) = ""
1395  REM  PRINT "DONE SHFFLING !"
1399  RETURN 

1400  REM  
1401  REM  **********************
1402  REM  CHANGE DIRECTORY (PRO-DOS ONLY).  THERE IS NO SUCH THING AS DIRECTORIES IN NORMAL APPLE DOS.  HOW DO YOU KNOW IF YOU ARE RUNNING UNDER PRO-DOS ???
1403  REM  **********************
1410  TEXT : HOME 
1415  ONERR  GOTO 1470 : REM  ON ANY ERRORS ...
1420  REM  THE PRO-DOS "PREFIX" COMMAND CHANGES THE DIRECTORY.
1425  PRINT : PRINT 
1430  PRINT " WARNING: DIRECTORIES ARE PRO-DOS ONLY !"
1435  PRINT " ENTER NOTHING IF YOU ARE NOT SURE !!"
1440  PRINT : PRINT 
1445  INPUT "INPUT PREFIX "; P$
1450  IF P$ = "" THEN  GOTO 1470
1460  PRINT D$; "PREFIX "; P$
1470  GOSUB 9700 : REM  HIT ANY KEY TO CONTINUE
1499  RETURN 

1500  REM  
1501  REM  **********************
1502  REM  CATALOG DISK
1503  REM  **********************
1510  TEXT : HOME 
1520  PRINT D$; "CATALOG"
1530  GOSUB 9700 : REM  HIT ANY KEY TO CONTINUE
1599  RETURN 

9400  REM 
9401  REM  **********************
9402  REM  SAVE FILE TO DISK.
9403  REM  **********************
9410  IF FC = 0 THEN  PRINT : PRINT " << FILE HAS NOT CHANGED >>" : GOTO 9490 : REM  FILE HAS NOT CHANGED - SO DO NOT PROMPT USER TO SAVE IT !
9415  ONERR  GOTO 9490 : REM  ON ANY ERRORS ...
9420  PRINT "SAVING "; F$; " ... "
9425  PRINT D$; "OPEN "; F$
9430  PRINT D$; "WRITE "; F$
9450  FOR I = 1 TO L
9460  PRINT W$(I)
9470  NEXT I
9475  PRINT D$; "CLOSE "; F$
9480  PRINT "CLOSE "; F$
9485  PRINT L" LINES SAVED !"
9490  GOSUB 9700 : REM  HIT ANY KEY TO CONTINUE
9495  FC = 0 : REM  FILE HAS NOT CHANGED !
9499  RETURN 

9500  REM 
9501  REM  **********************
9502  REM  IF FILE HAS BEEN CHANGED THEN PROMPT USER TO SAVE IT.
9503  REM  **********************
9510  IF FC = 0 THEN  GOTO 9599 : REM  FILE HAS NOT CHANGED - SO DO NOT PROMPT USER TO SAVE IT !
9520  PRINT : PRINT 
9525  INPUT "SAVE CHANGED FILE TO DISK (Y/N) "; AN$
9530  IF AN$ = "Y" THEN  GOSUB 9400 : REM  SAVE FILE
9599  RETURN 

9700  REM  
9701  REM  **********************
9702  REM  HIT ANY KEY TO CONTINUE
9703  REM  **********************
9710  PRINT : PRINT 
9715  PRINT " << HIT ANY KEY TO CONTINUE >> ";
9720  GET H1$
9730  PRINT 
9790  REM  TEXT : HOME
9799  RETURN 

9800  REM  
9801  REM  **********************
9802  REM  ON ANY ERRORS
9803  REM  - SUCH AS END-OF-FILE, OR,
9804  REM  - FILE DOES NOT EXIST
9805  REM  THEN CLOSE THE FILE.
9806  REM  **********************
9810  PRINT : PRINT "DOS ERROR CODE = " PEEK (222) : REM  GET DOS ERROR CODE
9825  PRINT "CLOSE "; F$
9830  PRINT D$; "CLOSE "; F$
9899  RETURN 

9900  REM  
9901  REM  **********************
9902  REM  EXIT PROGRAM
9903  REM  **********************
9905  TEXT : HOME 
9910  GOSUB 9500 : REM  IF FILE HAS BEEN CHANGED THEN PROMPT USER TO SAVE IT.
9970  PRINT : PRINT 
9975  PRINT "THANKS FOR USING TEXT EDITOR / VIEWER"
9980  PRINT : PRINT 
9985  PRINT "DON'T FORGET : CONTACT MIKE O'MALLEY"
9990  PRINT "               FOR PROGRAM UPDATES"
9995  PRINT : PRINT 
9999  END 
